package com.labot.dao.hibernate;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.labot.dao.PedidoNoConformeDao;
import com.labot.model.PedidoNoConforme;
import com.labot.model.PedidoNoConformeBitacora;
import com.labot.types.EstadoPNMType;
import com.labot.types.MuestraType;
import com.labot.types.ReclamoType;
import com.labot.types.SiNoType;



/**
 * This class interacts with hibernate session to save/delete and
 * retrieve Role objects.
 *
 * @author <a href="mailto:bwnoll@gmail.com">Bryan Noll</a>
 * @author jgarcia (updated to hibernate 4)
 */
@Repository("pedidonoconformeDao")
public class PedidoNoConformeDaoHibernate extends GenericDaoHibernate<PedidoNoConforme, Long> implements PedidoNoConformeDao {

    /**
     * Constructor to create a Generics-based version using Role as the entity
     */
    public PedidoNoConformeDaoHibernate() {
        super(PedidoNoConforme.class);
    }

    /**
     * {@inheritDoc}
     */

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getNuevaMuestrasbyCentro(Long id) throws Exception {
		Query qry = getSession().createQuery("from PedidoNoConforme e WHERE e.centro.id = :id order by e.fecha desc");
		qry.setParameter("id", id);
        return (List<PedidoNoConforme>) qry.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getNuevaMuestrasporRango(Date fechadesde, Date fechahasta) {
		
		String query = "";
		
		if(fechadesde == null && fechahasta!=null)
			query = "from PedidoNoConforme e WHERE e.fecha <= :hasta order by e.fecha desc";
		if(fechadesde != null && fechahasta==null)
			query = "from PedidoNoConforme e WHERE e.fecha >= :desde order by e.fecha desc";
		if(fechadesde == null && fechahasta==null)
			query = "from PedidoNoConforme e order by e.fecha desc";
		if(fechadesde!=null && fechahasta!=null)
			query = "from PedidoNoConforme e WHERE e.fecha >= :desde AND e.fecha <= :hasta order by e.fecha desc";
		
		Query qry = getSession().createQuery(query);
		if(fechadesde!= null)
		qry.setParameter("desde", fechadesde);
		if(fechahasta!=null)
		qry.setParameter("hasta", fechahasta);
        return (List<PedidoNoConforme>) qry.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getNuevaMuestras() {
		Query qry = getSession().createQuery("from PedidoNoConforme WHERE e.reclamo = 'NMC' e order by e.fecha desc");
		return (List<PedidoNoConforme>) qry.list();
	}

	@Override
	public PedidoNoConforme saveNuevaMuestra(PedidoNoConforme pedidonoconforme) {
		super.save(pedidonoconforme);
        getSession().flush();
        return pedidonoconforme;
	}

	@SuppressWarnings("unchecked")
	@Override
	public Set<PedidoNoConformeBitacora> getBitacoras(Long idpedidonoconforme) {
		Query qry = getSession().createQuery("Select e.bitacoras from PedidoNoConforme e WHERE e.id = :idPedidoNoConforme order by e.fecha desc");
		qry.setParameter("idPedidoNoConforme", idpedidonoconforme);
		return (Set<PedidoNoConformeBitacora>) qry.list();
	}

	@Override
	public PedidoNoConforme buscarNuevaMuestra(Long id) {
		Query qry= getSession().createQuery("from PedidoNoConforme e WHERE e.id = :id");
		qry.setParameter("id", id);
		return (PedidoNoConforme) qry.uniqueResult();
	}

	

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getNuevaMuestrasEnProceso() {
		Query qry = getSession().createQuery("from PedidoNoConforme e where e.estadopnm = 'EN_PROCESO' AND e.urgente = 'NO' AND e.reclamo = 'NMC' order by e.fecha desc");
		return (List<PedidoNoConforme>) qry.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getNuevaMuestrasAvisado() {
		Query qry = getSession().createQuery("from PedidoNoConforme e where e.estadopnm = 'AVISADO' AND e.reclamo = 'NMC' order by e.fecha desc");
		return (List<PedidoNoConforme>) qry.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getNuevaMuestrasCerradas() {
		Query qry = getSession().createQuery("from PedidoNoConforme e where e.estadopnm = 'CERRADO' AND e.reclamo = 'NMC' order by e.fecha desc");
		return (List<PedidoNoConforme>) qry.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getNuevaMuestrasRegistradasNoUrgentes() {
		Query qry = getSession().createQuery("from PedidoNoConforme e where e.estadopnm = 'REGISTRADO' AND e.urgente = 'NO' AND e.reclamo = 'NMC' order by e.fecha desc");
		return (List<PedidoNoConforme>) qry.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getNuevaMuestrasUrgentes() {
		Query qry = getSession().createQuery("from PedidoNoConforme e where e.urgente = 'SI' AND e.estadopnm = 'EN_PROCESO' AND e.reclamo = 'NMC' order by e.fecha desc");
		return (List<PedidoNoConforme>) qry.list();
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public PedidoNoConforme getNuevaMuestraPorProtocolo(String protocolo) {
		Query qry = getSession().createQuery("from PedidoNoConforme e where e.numeroprotocolo = :protocolo AND e.reclamo = 'NMC' order by e.fecha desc");
		qry.setParameter("protocolo", protocolo);
		List<PedidoNoConforme> nmc = (List<PedidoNoConforme>) qry.list();
		if(nmc.isEmpty())
			return null;
		else
			return nmc.get(0);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getTodos() {
		Query qry = getSession().createQuery("from PedidoNoConforme e order by e.fecha desc");
		return (List<PedidoNoConforme>) qry.list();
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getPedidosAprocesar15hs() {
		
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		cal.add(Calendar.HOUR, -8);
		Date fechainicio = cal.getTime();
		
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(new Date());
		cal2.add(Calendar.HOUR, -2);
		Date fechafin = cal2.getTime();
		
		Query qry = getSession().createQuery("from PedidoNoConforme e where e.fecha >= :fechainicio AND e.fecha <= :fechafin AND e.reclamo = 'NMC' AND e.estadopnm = 'REGISTRADO' AND e.urgente = 'NO'");
		qry.setParameter("fechainicio", fechainicio);
		qry.setParameter("fechafin", fechafin);
		
		return (List<PedidoNoConforme>) qry.list();
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getPedidosAprocesar13hs() {
		
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		cal.add(Calendar.HOUR, -24);
		Date fechainicio = cal.getTime();
		
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(new Date());
		cal2.add(Calendar.HOUR, -14);
		Date fechafin = cal2.getTime();
		
		Query qry = getSession().createQuery("from PedidoNoConforme e WHERE e.fecha >= :fechainicio AND e.fecha <= :fechafin AND e.reclamo = 'NMC' AND e.estadopnm = 'REGISTRADO' AND e.urgente = 'NO'");
		qry.setParameter("fechainicio", fechainicio);
		qry.setParameter("fechafin", fechafin);
		
		return (List<PedidoNoConforme>) qry.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<PedidoNoConforme> getFiltrados(Long idareasolicita, String reclamo, String estado, String urgente,
			String muestra, Long idclasificacion, Date fechadesde, Date fechahasta, String numeroprotocolo) {
		
		String consulta = "from PedidoNoConforme e WHERE 1=1";
		
		if (idareasolicita != null && idareasolicita != -1)
			consulta = consulta + " AND e.areasolicita.id = :idareasolicita";
		if (reclamo != null && !reclamo.equals("-1"))
			consulta = consulta + " AND e.reclamo = :reclamo";
		if (estado != null && !estado.equals("-1"))
			consulta = consulta + " AND e.estadopnm = :estado";
		if (urgente != null && !urgente.equals("-1"))
			consulta = consulta + " AND e.urgente = :urgente";
		if (muestra != null && !muestra.equals("-1"))
			consulta = consulta + " AND e.tipomuestra = :muestra";
		if (idclasificacion != null && idclasificacion != -1)
			consulta = consulta + " AND e.clasificacion.id = :idclasificacion";
		if (fechadesde != null)
			consulta = consulta + " AND e.fecha >= :fechadesde";
		if (fechahasta != null)
			consulta = consulta + " AND e.fecha <= :fechahasta";
		if(numeroprotocolo != null && !numeroprotocolo.equals(""))
			consulta = consulta + " AND e.numeroprotocolo = :numeroprotocolo";
		
		consulta = consulta + " order by e.fecha desc";
		
		Query qry = getSession().createQuery(consulta);
		
		
		if (idareasolicita != null && idareasolicita != -1)
			qry.setParameter("idareasolicita", idareasolicita);
		if (reclamo != null && !reclamo.equals("-1"))
			qry.setParameter("reclamo", ReclamoType.valueOf(reclamo));
		if (estado != null && !estado.equals("-1"))
			qry.setParameter("estado", EstadoPNMType.valueOf(estado));
		if (urgente != null && !urgente.equals("-1"))
			qry.setParameter("urgente", SiNoType.valueOf(urgente));
		if (muestra != null && !muestra.equals("-1"))
			qry.setParameter("muestra", MuestraType.valueOf(muestra));
		if (idclasificacion != null && idclasificacion != -1)
			qry.setParameter("idclasificacion", idclasificacion);
		if (fechadesde != null)
			qry.setParameter("fechadesde", fechadesde);
		if (fechahasta != null)
			qry.setParameter("fechahasta", fechahasta);
		if (numeroprotocolo != null && !numeroprotocolo.equals(""))
			qry.setParameter("numeroprotocolo", numeroprotocolo);
		
		
		return (List<PedidoNoConforme>) qry.list();
		
		
	}
	
	
	
}
